Skip to content

fix(picker,c.1115): recent_delivery voit LIVRÉ-urn via marqueur [INFO] candidate-delivered (Tell c.1060-L1 reformulé) - #15802

Merged
jsboige merged 1 commit into
mainfrom
fix/c1115-picker-delivered-via-marker
Sep 12, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/c1115-picker-delivered-via-marker

Conversation

@jsboige

@jsboige jsboige commented Sep 12, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/guard — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #15753

Summary

Fix c.1115 voie 1 : recent_delivery() détecte les LIVRÉ-urn déguisées par marqueur [INFO] candidate-delivered en commentaire, pas seulement par label GitHub. Le sweep quotidien 05:37Z retracte le label sur activité post-merge ; or les lanes elles-mêmes postent des [INFO] quand elles en rencontrent une — treadmill auto-entretenu qui rend #14373 (4 marqueurs de 4 lanes, PR #14455 MERGED) invisible au filtre labels seul.

Tell c.1060-L1 reformulé par ai-01 (msg-20260912T165428-k6rbfc, vérifications firsthand l.406/524/535/958) : klass delivered si label OU marqueur, en respectant l'invariant recent_delivery() (1 requête par candidat tiré, jamais scan du pool).

Scope

Fichier + / − Rôle
scripts/pick_idle_grain.py +57 / −0 module-level _DELIVERED_MARKER_RE (couvre [INFO] et [INFO ), helper _has_delivered_marker(), branche if not prs étendue dans recent_delivery()
scripts/tests/test_pick_idle_grain.py +160 / −5 6 nouveaux tests (contrôle positif fondateur, regression préservée, invariant coût, TRAVAIL EN COURS prime, best-effort, deux formes bracket) + ajustement de test_query_shape_bounded_one_per_candidate (1→2 requêtes max par pick)

Aucun changement au code de production hors pick_idle_grain.py. Aucun impact sur les consumers (le champ klass existait déjà, le contrat reste grain/umbrella/delivered).

Diagnostic — pourquoi ce fix, pas un autre

Le sweep quotidien candidate-delivered-advisory.yml retracte le label sur activité de commentaire post-merge (workflow doc, en-tête du YAML). Or, les lanes elles-mêmes postent des commentaires [INFO] candidate-delivered quand elles en rencontrent une — exactement le genre d'activité qui fait retracter le label. Résultat mesuré :

Le picker respectait l'invariant « 1 requête par candidat tiré » via la branche if not prs: continue — qui skip quand aucune PR ne référence l'issue. C'est exactement là que les LIVRÉ-urn déguisées passent : pas de label, pas de PR référençante, donc rien. Le fix ajoute un fallback à 1 requête gh issue view N --comments dans cette branche — uniquement quand prs est vide, donc coût net zéro pour les picks avec PR couvrant, +1 requête pour les picks sans.

Ce qui change en pratique

Avant : recent_delivery() annote « TRAVAIL EN COURS » (PR ouverte) ou « LIVRAISON RECENTE » (PR MERGED référençante). Pour les LIVRÉ-urn déguisées : silence.

Après : quand prs est vide ET _has_delivered_marker() retourne True, annote « LIVRÉ-urn VIA MARQUEUR [INFO] candidate-delivered en commentaire (label GitHub absent/decay) » et mute p["klass"] = "delivered" pour que les consumers en aval le voient (filtre admission l.2815, JSON output, itérations futures du picker).

Vérification live

_has_delivered_marker(14373) = True   # 4 marqueurs, 2 PR référençantes (court-circuit avant check)
_has_delivered_marker(14910) = True   # 1 marqueur, 0 PR référençante (cas fondateur ai-01)

recent_delivery([#14910]) =
  notes    = {14910: "LIVRÉ-urn VIA MARQUEUR [INFO] candidate-delivered en commentaire..."}
  klass    = "delivered"

Tests

120/120 verts (114 existants + 6 nouveaux). Coût additionnel plafonné : 2 requêtes max par pick (1 PR list + 1 issue view), 1 requête par pick quand PR couvrante (shortcut à l.1077 continue).

collected 120 items
..... 120 passed in 0.52s

Anti-double-claim vérifié

gh pr list --state open --search "delivered OR klass OR candidate-delivered in:title" ne retourne aucune PR ouverte sur le sujet (vérifié ai-01 firsthand et revérifié ici au moment du push). PR #15522 fix/14307-verdict-sticky porte sur le retrait humain du label, pas sur le fallback marqueur — orthogonal.

Liens

  • Tell c.1060-L1 ★ (PROPOSED) pool-capability-aware-traversal-LIVRÉ-urn-deguisés-multiples
  • Tell c.1113 ★★ ★× fondateur picker-exclude-LIVRÉ-urn-comments-multi-lanes
  • Tell c.1356 ★★★ preflight --state all
  • Tell c.15069 strict urne delivered reserved coordinateur/adjoint
  • Tell c.1502 strict 0 merge/close d'autrui
  • ai-01 spec : msg-20260912T165428-k6rbfc (HIGH, vérifications firsthand l.406/524/535/958)

🤖 Generated with Claude Code

…] candidate-delivered

Tell c.1060-L1 reformule (msg-20260912T165428-k6rbfc, ai-01 spec) : la
klass `delivered` doit etre posee sur signal label OU marqueur, avec 1
requete par candidat tire (invariant recent_delivery l.958 preserve).

Cas fondateur : #14373 (4 marqueurs `[INFO candidate-delivered]` de 4
lanes distinctes, PR #14455 MERGED, label absent au moment du test -- le
sweep quotidien 05:37Z retracte le label sur activite de commentaire, et
les lanes elles-memes postent des [INFO] quand elles en rencontrent une :
treadmill auto-entretenu).

Implementation :
- module-level `_DELIVERED_MARKER_RE` (couvre `[INFO]` et `[INFO `, les
  deux formes employees).
- helper `_has_delivered_marker(issue_number)` -- 1 requete `gh issue
  view N --comments --json comments`, retourne True/False/None
  (None = best-effort silencieux en cas de timeout/rate-limit).
- dans `recent_delivery()`, branche `if not prs` : si marqueur trouve,
  annote `LIVRE-urn VIA MARQUEUR [...]` et mute `p["klass"] = "delivered"`
  pour que les consumers en aval (filtre admission, JSON output, futures
  iterations du picker) le voient.

Tests : 6 nouveaux dans `test_pick_idle_grain.py` :
1. marker_only_surfaces_delivered_urn (controle positif, cas fondateur)
2. no_marker_no_label_no_note (regression preservee)
3. marker_check_one_request_per_pick_invariant (cout borne)
4. marker_does_not_shortcut_pr_check (TRAVAIL EN COURS prime)
5. marker_check_failure_treated_as_no_signal (best-effort)
6. marker_regex_matches_both_bracket_forms (les 2 formes)

Verification live : `_has_delivered_marker(14373) = True` (4 marqueurs) ;
`_has_delivered_marker(14910) = True` (1 marqueur, 0 PR referencante --
cas fondateur ai-01 cite verbatim). `recent_delivery()` sur #14910 rend
notes={14910: "LIVRE-urn VIA MARQUEUR..."} et mute klass a `delivered`.

Cout net : 1 requete additionnelle par pick SANS PR couvrante (les picks
avec PR couvrant ne declenchent pas le check, shortcut a l.1077). Plafonne
a 2 requetes par pick au lieu de 1 -- invariant recent_delivery (1 par
candidat tire, jamais scan du pool) preserve.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions github-actions Bot added variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) and removed variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #15702 (LIGHT/guard, merge a 2026-09-12T09:43:43Z), #15638 (MED/guard, merge a 2026-09-12T09:43:53Z), #15752 (LIGHT/docs, merge a 2026-09-12T11:43:23Z), #15774 (MED/guard, merge a 2026-09-12T15:54:10Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-12) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=4 cap=3)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=4 cap=3)

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige
jsboige merged commit e23d722 into main Sep 12, 2026
15 of 17 checks passed
@jsboige

jsboige commented Sep 12, 2026

Copy link
Copy Markdown
Owner Author

✅ [DONE] c.1115 voie 1 picker — fix LIVRÉ-urn via marqueur

PR #15802 merged à 18:43:31Z (commit e23d7228dd006659c8be44c87252b86398837cf0).

Tell c.1060-L1 reformulé par ai-01 (msg-20260912T165428-k6rbfc) implémenté. Le picker détecte maintenant les LIVRÉ-urn déguisées par marqueur [INFO] candidate-delivered en commentaire, pas seulement par label GitHub. Cas fondateur #14910 (1 marqueur, 0 PR référençante) servi en LIVE : klass=delivered, note 'LIVRÉ-urn VIA MARQUEUR'.

Tells fondateurs c.1115 :

Worktrees retirés : CoursIA-c1115-picker + branche fix/c1115-picker-delivered-via-marker supprimée.

R1 TENU ×1 (mandat R1 ≥1 PR/wakeup). G-VAR-1 atteint (DEEP/guard mais CONTENTU META — Tell c.993 ★ attention, ce cycle est META-heavy, à compenser c.1116+ avec un grain CONTENTU : #15335 GameTheory tranche B pré-substantié par ai-01).

PR #15753 dissipation couronne Tell c.994 ★★★ ★× fondateur dissipée aussi (merged 18:44:02Z, substance 1405970 déjà sur main via cherry-pick antérieur).

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant